home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
9-Digit Zip Code Directory
/
9-Digit Zip Code Directory (American Business Information) (ABIZIP-12).ISO
/
z4src.zip
/
CLPARM.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-24
|
25KB
|
843 lines
//----------------------------------------------------------------------------
// MODULE DESCRIPTION
//
// Module: clparm.cpp
// Title: C++ Class Libraries
// Notice: John M. Weeder
// Copyright (c) 1993. All rights reserved.
// This module contains proprietary information and should be
// treated as confidential.
//
//----------------------------------------------------------------------------
// MAINTENANCE HISTORY
//
// $Workfile$
// $Revision$
// $Author$
// $Date$
// $Log$
//
//----------------------------------------------------------------------------
// MODULE NARRATIVE
//
// This module contains code for the class CL_PARM.
//
// The code in this module may be written in C++ or C.
//
// This module is portable to:
// DOS 3.X+
// MS Windows 3.X+
// OS/2 2.X+
// OS/2 2.0 PM
//
// The following compilers are supported:
// MSC 6.0A
// MSC/C++ 7.0
// Borland C++ 3.1 for DOS
// Borland C++ 1.0 for OS/2 2.X
//
//----------------------------------------------------------------------------
#include <class.hpp>
//----------------------------------------------------------------------------
// Globals
//----------------------------------------------------------------------------
PCSZ CL_PARM::pcszParmName = "~PARM";
PCSZ CL_PARM::pcszGarbleName = "~GARBLE";
PCSZ CL_PARM::pcszVersion = "VERSION";
PCSZ CL_PARM::pcszAccess = "ACCESS_CODE";
PCSZ CL_PARM::pcszSerial = "SERIAL_NO";
PCSZ CL_PARM::pcszCopyright = "COPYRIGHT";
PCSZ CL_PARM::pcszId = "PROGRAM_ID";
PCSZ CL_PARM::pcszName = "PROGRAM_NAME";
PCSZ CL_PARM::pcszRegister = "REGISTER";
//----------------------------------------------------------------------------
// Description: Default constructor
// Parameters:
// Returns:
//----------------------------------------------------------------------------
FN_M CL_PARM::CL_PARM()
{
CL_PARM::Initialize(CL_INIT_CLASS);
}
//----------------------------------------------------------------------------
// Description: Copy constructor
// Parameters: rccl_parm Reference to object to copy.
// Returns:
//----------------------------------------------------------------------------
FN_M CL_PARM::CL_PARM(RCCL_PARM rccl_parm)
{
CL_PARM::Initialize(CL_INIT_CLASS);
*this = rccl_parm;
}
//----------------------------------------------------------------------------
// Description: Destructor
// Parameters:
// Returns:
//----------------------------------------------------------------------------
FN_M CL_PARM::~CL_PARM()
{
CL_PARM::Destroy(FALSE);
}
//----------------------------------------------------------------------------
// Description: Destroy object. Free any resources used by object.
// Normally called by destructor.
// Should allow multiple calls from various classes.
// Parameters: fDestroyAll Destroy parents also?
// Default is TRUE.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::Destroy(BOOL fDestroyAll)
{
strName.Destroy();
strVal.Destroy();
CL_PARM::Initialize(CL_INIT_CLASS_VARS);
if (fDestroyAll) // Destroy parent.
CL_PARM_PARENT::Destroy(fDestroyAll);
return TRUE;
}
//----------------------------------------------------------------------------
// Description: Get parameter value
// Parameters: pcszDft Default value of string.
// If null, the default is the empty string.
// Default value is NULL.
// pcszGarble If not null, the string is garbled using
// this key before it is stored.
// Default is NULL.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::Get(PCSZ pcszDft, PCSZ pcszGarble)
{
if (!strName.IsValid())
return FALSE;
if (pcszDft == NULL)
pcszDft = "";
fValid = FALSE; // Clear variables
fText = TRUE;
fNumeric = FALSE;
lVal = lMin;
strVal.Empty();
PBYTE pb = NULL;
SIZET cb = 0;
PCSZ pcszName = pcszGarble ? pcszGarbleName: pcszParmName;
if (ReadObject((PCSZ)strName, pcszName, &pb, &cb))
{
if (pcszGarble) // Un garble the string
{
PBYTE pbKey = (PBYTE)pcszGarble;
SIZET cbKey = strlen(pcszGarble) + 1;
Garble(pb, cb, pbKey, cbKey);
}
if (!cb || pb[cb - 1] != '\0')
return Error("Invalid parameter value.");
pcszDft = (PCSZ)pb;
}
else if (pcszGarble == NULL) // Check environment variable
{
PCSZ pcsz = EnvGet((PCSZ)strName);
if (pcsz)
pcszDft = pcsz;
}
BOOL fResult = FALSE;
if (pcszDft)
fResult = SetValue(pcszDft);
if (pb) // Free buffer
MemFree(pb);
return fResult;
}
//----------------------------------------------------------------------------
// Description: Get parameter value
// Parameters: lDft Default numeric value
// pcszGarble If not null, the string is garbled using
// this key before it is stored.
// Default is NULL.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::Get(LONG lDft, PCSZ pcszGarble)
{
CHAR szDft[12];
sprintf(szDft, "%ld", lDft);
return Get((PCSZ)szDft, pcszGarble);
}
//----------------------------------------------------------------------------
// Description: Get default configuration file parameters
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::GetCfg(PBS_CFG pcfg)
{
CL_PARM cl_parm;
CfgSet(NULL, CFG_CLEAR, pcfg);
cl_parm.SetName(pcszAccess);
if (!cl_parm.Get((PCSZ)CFG_ACCESS_DFT,pcszAccess))
return FALSE;
CfgSet((PCSZ)cl_parm, CFG_ACCESS, pcfg);
cl_parm.SetName(pcszSerial);
if (!cl_parm.Get((PCSZ)CFG_SERIAL_NO_DFT,pcszSerial))
return FALSE;
CfgSet((PCSZ)cl_parm, CFG_SERIAL_NO, pcfg);
cl_parm.SetName(pcszVersion);
if (!cl_parm.Get((PCSZ)CFG_VERSION_DFT,pcszVersion))
return FALSE;
CfgSet((PCSZ)cl_parm, CFG_VERSION, pcfg);
cl_parm.SetName(pcszCopyright);
if (!cl_parm.Get((PCSZ)CFG_COPYRIGHT_DFT, pcszCopyright))
return FALSE;
CfgSet((PCSZ)cl_parm, CFG_COPYRIGHT, pcfg);
cl_parm.SetName(pcszId);
if (!cl_parm.Get((PCSZ)CFG_PROGRAM_ID_DFT,pcszId))
return FALSE;
CfgSet((PCSZ)cl_parm, CFG_PROGRAM_ID, pcfg);
cl_parm.SetName(pcszName);
if (!cl_parm.Get((PCSZ)CFG_PROGRAM_NAME_DFT,pcszName))
return FALSE;
CfgSet((PCSZ)cl_parm, CFG_PROGRAM_NAME, pcfg);
cl_parm.SetName(pcszRegister);
if (!cl_parm.Get((PCSZ)CFG_REGISTER_DFT,pcszRegister))
return FALSE;
CfgSet((PCSZ)cl_parm, CFG_REGISTER, pcfg);
return TRUE;
}
//----------------------------------------------------------------------------
// Description: Initialize object.
// Normally called by constructor.
// Should allow multiple calls from various classes.
// Parameters: sInit Initialization code. May be one of the following:
// CL_INIT_CLASS Reset class variables and
// and dynamic allocations for
// this class only.
// CL_INIT_CLASS_VARS Reset class variables for
// this class only.
// CL_INIT_VARS Reset class variables for
// this class only.
// CL_INIT_ALL Initialize class and all
// parent class, including
// dynamic memory allocation.
// Default is CL_INIT_ALL
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::Initialize(SHORT sInit)
{
if (sInit == CL_INIT_VARS || sInit == CL_INIT_ALL)
CL_PARM_PARENT::Initialize(sInit);
fValid = FALSE;
fText = TRUE;
fNumeric = FALSE;
lVal = 0;
lMin = MIN_LONG;
lMax = MAX_LONG;
strName.Empty();
strVal.Empty();
return TRUE;
}
//----------------------------------------------------------------------------
// Description: Check if object is in error state.
// IsValid() && IsError() MUST NOT BE DEPENDENT ON ONE ANOTHER.
// Parameters:
// Returns: TRUE if in error state.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::IsError() const
{
return CL_PARM_PARENT::IsError() || strName.IsError() || strVal.IsError();
}
//----------------------------------------------------------------------------
// Description: Check if object is valid
// IsValid() && IsError() MUST NOT BE DEPENDENT ON ONE ANOTHER.
// Parameters:
// Returns: TRUE if valid
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::IsValid() const
{
return CL_PARM_PARENT::IsValid()
&& fValid
&& strName.IsValid()
&& strVal.IsValid();
}
//----------------------------------------------------------------------------
// Description: Assign minimum and maximum limits for numeric values.
// Parameters: lMin Minimum value.
// Default is MIN_LONG.
// lMax Maximum value.
// Default is MAX_LONG.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::MinMax(LONG lMin, LONG lMax)
{
if (lMin > lMax) // Swap values if needed
{
LONG lTemp = lMax;
lMax = lMin;
lMin = lTemp;
}
CL_PARM::lMin = lMin; // Set min/max
CL_PARM::lMax = lMax;
if (lVal < lMin) // Force numeric value into range
lVal = lMin;
if (lVal > lMax)
lVal = lMax;
if (!fText && fValid) // Re-assign text value of numeric
{
strVal("%ld", lVal);
if (strVal.IsError())
SetError();
}
return !IsError();
}
//----------------------------------------------------------------------------
// Description: Assignment operator
// NOTE: Don't copy object into self
// Parameters: rccl_parm Reference to right value.
// Returns: Reference to new object.
//----------------------------------------------------------------------------
RCCL_PARM FN_M CL_PARM::operator=(RCCL_PARM rccl_parm)
{
if (this != &rccl_parm)
{
if (rccl_parm.IsError())
{
Destroy();
SetError(rccl_parm.ErrorCode());
}
else
{
CAST(CL_PARM_PARENT,*this) = CAST(CL_PARM_PARENT,rccl_parm);
fValid = rccl_parm.fValid;
fText = rccl_parm.fText;
fNumeric = rccl_parm.fNumeric;
lVal = rccl_parm.lVal;
lMin = rccl_parm.lMin;
lMax = rccl_parm.lMax;
strName = rccl_parm.strName;
strVal = rccl_parm.strVal;
if (IsError())
SetError();
}
}
return (RCCL_PARM)*this;
}
//----------------------------------------------------------------------------
// Description: Set parm using a BYTE value.
// Parameters: bVal Value.
// Returns: Reference to parameter
//----------------------------------------------------------------------------
RCCL_PARM FN_M CL_PARM::operator=(BYTE bVal)
{
SetValue((LONG)bVal);
return (RCCL_PARM)*this;
}
//----------------------------------------------------------------------------
// Description: Set parm using a CHAR value.
// Parameters: chVal Value.
// Returns: Reference to parameter
//----------------------------------------------------------------------------
RCCL_PARM FN_M CL_PARM::operator=(CHAR chVal)
{
SetValue((CHAR)chVal);
return (RCCL_PARM)*this;
}
//----------------------------------------------------------------------------
// Description: Set parm using a LONG value.
// Parameters: lVal Value.
// Returns: Reference to parameter
//----------------------------------------------------------------------------
RCCL_PARM FN_M CL_PARM::operator=(LONG lVal)
{
SetValue(lVal);
return (RCCL_PARM)*this;
}
//----------------------------------------------------------------------------
// Description: Set parm using a PCSZ value.
// Parameters: pcsz Value.
// Returns: Reference to parameter
//----------------------------------------------------------------------------
RCCL_PARM FN_M CL_PARM::operator=(PCSZ pcsz)
{
SetValue(pcsz);
return (RCCL_PARM)*this;
}
//----------------------------------------------------------------------------
// Description: Set parm using a PSZ value.
// Parameters: psz Value.
// Returns: Reference to parameter
//----------------------------------------------------------------------------
RCCL_PARM FN_M CL_PARM::operator=(PSZ psz)
{
SetValue((PCSZ)psz);
return (RCCL_PARM)*this;
}
//----------------------------------------------------------------------------
// Description: Set parm using a SHORT value.
// Parameters: sVal Value.
// Returns: Reference to parameter
//----------------------------------------------------------------------------
RCCL_PARM FN_M CL_PARM::operator=(SHORT sVal)
{
SetValue((LONG)sVal);
return (RCCL_PARM)*this;
}
//----------------------------------------------------------------------------
// Description: Set parm using a ULONG value.
// Parameters: ulVal Value.
// Returns: Reference to parameter
//----------------------------------------------------------------------------
RCCL_PARM FN_M CL_PARM::operator=(ULONG ulVal)
{
SetValue((LONG)ulVal);
return (RCCL_PARM)*this;
}
//----------------------------------------------------------------------------
// Description: Set parm using a USHORT value.
// Parameters: usVal Value.
// Returns: Reference to parameter
//----------------------------------------------------------------------------
RCCL_PARM FN_M CL_PARM::operator=(USHORT usVal)
{
SetValue((LONG)usVal);
return (RCCL_PARM)*this;
}
//----------------------------------------------------------------------------
// Description: Cast parm to a BYTE.
// Parameters:
// Returns: Value of cast
//----------------------------------------------------------------------------
FN_M CL_PARM::operator BYTE() const
{
return (BYTE)lVal;
}
//----------------------------------------------------------------------------
// Description: Cast parm to a CHAR.
// Parameters:
// Returns: Value of cast
//----------------------------------------------------------------------------
FN_M CL_PARM::operator CHAR() const
{
return (CHAR)lVal;
}
//----------------------------------------------------------------------------
// Description: Cast parm to a LONG.
// Parameters:
// Returns: Value of cast
//----------------------------------------------------------------------------
FN_M CL_PARM::operator LONG() const
{
return (LONG)lVal;
}
//----------------------------------------------------------------------------
// Description: Cast parm to a PCSZ.
// Parameters:
// Returns: Value of cast
//----------------------------------------------------------------------------
FN_M CL_PARM::operator PCSZ() const
{
return (PCSZ)strVal;
}
//----------------------------------------------------------------------------
// Description: Cast parm to a PSZ.
// Parameters:
// Returns: Value of cast
//----------------------------------------------------------------------------
FN_M CL_PARM::operator PSZ() const
{
return (PSZ)strVal;
}
//----------------------------------------------------------------------------
// Description: Cast parm to a RBS_STRING.
// Parameters:
// Returns: Value of cast
//----------------------------------------------------------------------------
FN_M CL_PARM::operator RCL_STRING() const
{
return (RCL_STRING)strVal;
}
//----------------------------------------------------------------------------
// Description: Cast parm to a SHORT.
// Parameters:
// Returns: Value of cast
//----------------------------------------------------------------------------
FN_M CL_PARM::operator SHORT() const
{
return (SHORT)lVal;
}
//----------------------------------------------------------------------------
// Description: Cast parm to a ULONG.
// Parameters:
// Returns: Value of cast
//----------------------------------------------------------------------------
FN_M CL_PARM::operator ULONG() const
{
return (ULONG)lVal;
}
//----------------------------------------------------------------------------
// Description: Cast parm to a USHORT.
// Parameters:
// Returns: Value of cast
//----------------------------------------------------------------------------
FN_M CL_PARM::operator USHORT() const
{
return (USHORT)lVal;
}
//----------------------------------------------------------------------------
// Description: Retrieve object from persistent storage
// Parameters: pcsz Name of object.
// pcszSub Sub-name of object.
// The first character of the name should be '~'.
// If NULL, no sub name is available.
// Default is NULL
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::Retrieve(PCSZ pcsz, PCSZ pcszSub)
{
NOTUSED(pcsz);
NOTUSED(pcszSub);
Invalid("CL_PARM::Retrieve");
return FALSE;
}
//----------------------------------------------------------------------------
// Description: Store parameter to persistent storage
// Parameters: pcszGarble If not null, the string is garbled using
// this key before it is stored.
// Default is NULL.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::Set(PCSZ pcszGarble)
{
if (IsError() || !strName.IsValid())
return FALSE;
PBYTE pb = (PBYTE)(PSZ)strVal;
SIZET cb = strVal.Len() + 1;
PBYTE pbKey;
SIZET cbKey;
if (pcszGarble)
{
pbKey = (PBYTE)pcszGarble;
cbKey = strlen(pcszGarble) + 1;
Garble(pb, cb, pbKey, cbKey);
}
PCSZ pcszName = pcszGarble ? pcszGarbleName: pcszParmName;
if (!WriteObject((PCSZ)strName, pcszName, pb, cb))
SetError();
if (pcszGarble)
Garble(pb, cb, pbKey, cbKey);
return !IsError();
}
//----------------------------------------------------------------------------
// Description: Set default configuration file parameters
// Parameters:
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::SetCfg(PBS_CFG pcfg)
{
CL_PARM cl_parm;
cl_parm.SetName(pcszAccess);
cl_parm = CfgGet(CFG_ACCESS, pcfg);
if (!cl_parm.Set(pcszAccess))
return FALSE;
cl_parm.SetName(pcszSerial);
cl_parm = CfgGet(CFG_SERIAL_NO, pcfg);
if (!cl_parm.Set(pcszSerial))
return FALSE;
cl_parm.SetName(pcszVersion);
cl_parm = CfgGet(CFG_VERSION, pcfg);
if (!cl_parm.Set(pcszVersion))
return FALSE;
cl_parm.SetName(pcszCopyright);
cl_parm = CfgGet(CFG_COPYRIGHT, pcfg);
if (!cl_parm.Set(pcszCopyright))
return FALSE;
cl_parm.SetName(pcszId);
cl_parm = CfgGet(CFG_PROGRAM_ID, pcfg);
if (!cl_parm.Set(pcszId))
return FALSE;
cl_parm.SetName(pcszName);
cl_parm = CfgGet(CFG_PROGRAM_NAME, pcfg);
if (!cl_parm.Set(pcszName))
return FALSE;
cl_parm.SetName(pcszRegister);
cl_parm = CfgGet(CFG_REGISTER, pcfg);
if (!cl_parm.Set(pcszRegister))
return FALSE;
return TRUE;
}
//----------------------------------------------------------------------------
// Description: Set name of parameter
// Parameters: pcszName Name of parameter in a printf() style format
// strings.
// Use '%%' to include a percent sign.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_MV CL_PARM::SetName(PCSZ pcszName,...)
{
va_list marker;
va_start(marker,pcszName);
strName.Create(0, pcszName, marker);
va_end(marker);
strName.Upper();
if (strName.IsError())
SetError();
return !IsError();
}
//----------------------------------------------------------------------------
// Description: Set long value of object.
// Parameters: l New value of object.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::SetValue(LONG l)
{
fValid = TRUE;
fText = FALSE;
fNumeric = TRUE;
lVal = l;
strVal.Empty();
return MinMax(lMin, lMax); // Call min/max to force into range
}
//----------------------------------------------------------------------------
// Description: Set string value of object.
// Parameters: pcsz New value for object.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::SetValue(PCSZ pcsz)
{
fValid = TRUE; // Clear variables
fText = TRUE;
strVal = pcsz;
if (strVal.IsError())
return SetError();
if (!strVal.ValidLong(&lVal)) // Try to extract numeric value
{
fNumeric = FALSE;
lVal = lMin;
}
else
fNumeric = TRUE;
return MinMax(lMin, lMax); // Call min/max to force into range
}
//----------------------------------------------------------------------------
// Description: Store object to persistent storage
// Parameters: pcsz Name of object.
// pcszSub Sub-name of object.
// The first character of the name should be '~'.
// If NULL, no sub name is available.
// Default is NULL
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
BOOL FN_M CL_PARM::Store(PCSZ pcsz, PCSZ pcszSub)
{
NOTUSED(pcsz);
NOTUSED(pcszSub);
Invalid("CL_PARM::Store");
return FALSE;
}
//----------------------------------------------------------------------------
// Description: Print object value to debugging output.
// Parameters: pccl_parm Pointer to dynamic object.
// If NULL, static data elements are printed.
// Default is NULL.
// pcsz Name of object.
// If NULL, no name is displayed.
// Default is NULL.
// cLevel Display level.
// Default is zero.
// Returns:
//----------------------------------------------------------------------------
#if COMPILE_DEBUG
VOID FN_M CL_PARM::Print(PCCL_PARM pccl_parm, PCSZ pcsz, SIZET cLevel)
{
#if COMPILE_TEST
OutputL(cLevel, "CL_PARM%s%s", (pcsz?"::":""), (pcsz?pcsz:""));
cLevel++;
if (pccl_parm)
{
Output(" <%p>\n", pccl_parm);
if(!pccl_parm->IsError())
{
OutputL(cLevel, "fValid = %d\n", pccl_parm->fValid);
OutputL(cLevel, "strName = %s\n", (PCSZ)pccl_parm->strName);
OutputL(cLevel, "strVal = %s\n", (PCSZ)pccl_parm->strVal);
OutputL(cLevel, "fText = %d\n", pccl_parm->fText);
OutputL(cLevel, "lVal = %ld\n", pccl_parm->lVal);
OutputL(cLevel, "lMin = %ld\n", pccl_parm->lMin);
OutputL(cLevel, "lMax = %ld\n", pccl_parm->lMax);
}
}
else
Output(" <NULL>\n");
CL_PARM_PARENT::Print((CL_PARM_PARENT _FAR_ *)pccl_parm, pcsz, cLevel);
return ;
#else
NOTUSED(cLevel);
NOTUSED(pccl_parm);
NOTUSED(pcsz);
return ;
#endif
}
#endif
//----------------------------------------------------------------------------
// Description: Run standard test suite on object.
// Parameters: sTest Test to run.
// If 0, run default tests.
// Default is 0.
// Returns: TRUE if successful.
//----------------------------------------------------------------------------
#if COMPILE_DEBUG
BOOL FN_M CL_PARM::Test(SHORT sTest)
{
#if COMPILE_TEST
if (sTest == 1) // Test 1 is always a test of storage
{
CL_PARM cl_parm;
cl_parm.Store("CL_PARM");
cl_parm.Retrieve("CL_PARM");
CL_PARM::Print(&cl_parm);
}
NOTUSED(sTest);
CL_PARM parm;
parm.SetName("%s is the Name", "THIS");
Print(&parm);
parm = (SHORT)5;
Print(&parm);
SHORT s = parm;
Output("s = %hd\n", s);
parm = "5567";
Print(&parm);
parm.MinMax(1, 10);
Print(&parm);
parm = "This is it.";
Print(&parm);
parm.Get("Default string");
Print(&parm);
parm.Set();
Print(&parm);
parm = NULL;
parm.Get("New default string");
Print(&parm);
parm.SetName("ENV_VAR");
parm = "This is the string value to store.";
Print(&parm);
parm.Set("GARBLED NAME");
parm.Destroy();
parm.SetName("ENV_VAR");
parm.Get((PSZ)NULL, "GARBLED NAME");
Print(&parm);
return TRUE;
#else
NOTUSED(sTest);
return TRUE;
#endif
}
#endif
//----------------------------------------------------------------------------
//------------------------------- End of File --------------------------------
//----------------------------------------------------------------------------